package org.nox.helloseries.core.services.configuration.serie.impl;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.nox.helloseries.core.services.configuration.serie.SerieConfigurationService;
import org.nox.helloseries.core.util.MarshallingHelper;
import org.nox.helloseries.domain.Serie;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class DefaultSerieConfigurationService implements SerieConfigurationService
{
    private static final Logger LOG = LoggerFactory.getLogger( DefaultSerieConfigurationService.class );

    // Initialisation
    private static final String DATA_FILE_NAME = "/data/data.xml";

    @Override
    public List<Serie> getSeries()
    {
        LOG.info( "Récupération du contenu du fichier de configuration" );
        // Récupération du contenu du fichier
        String xmlData = getContenuFichierSeries();

        if ( StringUtils.isNotEmpty( xmlData ) )
        {
            LOG.info( "Marshalling du retour" );
            // Marshalling du fichier
            try
            {

                List<Serie> series = (List<Serie>) MarshallingHelper.toObject( xmlData );
                LOG.info( series.size() + " séries trouvés en conf" );
                return series;
            }
            catch ( ClassCastException e )
            {
                LOG.error( "Fichier de configuration de série corrompu" );
            }
        }
        return new ArrayList<>();
    }

    @Override
    public void saveSeries( List<Serie> series )
    {
        saveSeries( series, false );
    }

    @Override
    public void saveSeries( List<Serie> series, boolean withBackup )
    {
        try
        {
            if ( withBackup )
            {
                FileUtils.copyFile( getDataFile(), new File( System.getProperty( "helloseries.home" ) + DATA_FILE_NAME + "." + System.currentTimeMillis() ) );
            }
            FileUtils.writeStringToFile( getDataFile(), MarshallingHelper.toXML( series ) );
        }
        catch ( IOException e )
        {
            LOG.error( "Impossible d'ouvrir le fichier", e );
        }
    }

    private String getContenuFichierSeries()
    {
        try
        {
            LOG.debug( getDataFile().getAbsolutePath() );
            return FileUtils.readFileToString( getDataFile() );
        }
        catch ( IOException e )
        {
            LOG.error( "Impossible d'ouvrir le fichier", e );
        }
        return null;
    }

    private File getDataFile()
    {
        String path = System.getProperty( "helloseries.home" ) + "/" + DATA_FILE_NAME;
        File file = new File( path );
        if ( file.exists() )
        {
            LOG.debug( "Path du fichier des séries : {}", path );
            return file;
        }
        else
        {
            LOG.error( "Fichier de configuration des séries introuvable : {}", path );
            return null;
        }
    }

    @Override
    public List<Serie> getSeriesActives()
    {
        return (List<Serie>) CollectionUtils.select( getSeries(), new Predicate()
        {

            @Override
            public boolean evaluate( Object arg0 )
            {
                return ( (Serie) arg0 ).isActive();
            }
        } );
    }
}
